import numpy as np


def gradient_decent(f, grad_f, X_cur):
    # 误差
    EPSILON = 0.01
    # 步长
    alpha = 0.5
    set_X = [X_cur.copy()]
    i = 1
    while True:
        dX = grad_f(X_cur)
        # 根据梯度判断是否满足误差
        if np.sqrt(np.sum(dX ** 2)) <= EPSILON:
            break
        # 使用线搜索判断步长
        while f(X_cur - alpha * dX) > f(X_cur):
            alpha /= 2
        # 迭代到下一个点
        X_cur -= alpha * dX
        # 打印信息
        print("%d轮迭代：" % i, X_cur)
        i += 1
        set_X.append(X_cur.copy())
    set_X = np.array(set_X)
    return set_X
